let obj = {
  a: 100,
  b: [10, 20, 30],
  c: {
    x: 10
  },
  d: /^\d+$/,
  e: () => {
    console.log('e');
  }
};

let arr = [10, [100, 200], {
  x: 10,
  y: 20
}]

// 以上是期望进行克隆的对象.


// 深克隆 - 最终方案
// 我们采取递归的方式实现深克隆

function deepClone(obj) {
  let newObj = new obj.constructor;
  // 记得，我们要对对象进行判断，如果是null，我们直接返回null
  if (typeof obj !== undefined && obj === null) {
    return null;
  }
  // 如果不是 object ，直接返回即可
  if (typeof obj !== 'object') {
    return obj;
  }
  // 底层的克隆，判断RegExp、Date类型
  // 这里记得，Object的子类型要通过instanceof来判断
  if (obj instanceof RegExp) {
    return new RegExp(obj);
  }
  if (obj instanceof Date) {
    return new Date(obj);
  }
  // 判断 Function
  if (obj instanceof Function) {
    return Object.prototype.toString.call(obj);
  }
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }
  return newObj;
}

const ans = deepClone(obj);

console.log(ans);